#include "DebugParser.h"

DebugParser::DebugParser(Mapa* unMapa, FabricaDeJugadores* fabricaDeJugadores, TiradorDeDados* tiradorDeDados) : xmlpp::SaxParser()
{
	this->mapa = unMapa;
	this->fabricaDeJugadores = fabricaDeJugadores;
	this->tiradorDeDados = tiradorDeDados;
}

DebugParser::~DebugParser()
{
}


void DebugParser::on_start_element(const Glib::ustring& name,
                                   const AttributeList& attributes)
{
	if (name.compare("configuracion") == 0) {
		for(xmlpp::SaxParser::AttributeList::const_iterator iter = attributes.begin(); iter != attributes.end(); ++iter)
			if (iter->name.compare("jugadores") == 0)
				juego = new JuegoServerImp(atoi(iter->value.data()),mapa,tiradorDeDados);
	}
	else if (name.compare("unirse") == 0) {
		for(xmlpp::SaxParser::AttributeList::const_iterator iter = attributes.begin(); iter != attributes.end(); ++iter)
			if (iter->name.compare("jugador") == 0)
				juego->unirse(this->fabricaDeJugadores->crearJugador(iter->value.data(),tiradorDeDados));
	}
	else if (name.compare("realizarAtaque") == 0)
		atacar(attributes);
	else if (name.compare("colocarEjercitos") == 0)
		colocarEjercitos(attributes);
	else if (name.compare("pasar") == 0)
		pasar(attributes);
	else if (name.compare("moverEjercitos") == 0)
			moverEjercitos(attributes);
	else if (name.compare("dadosParaDefender") == 0)
		dadosParaDefender(attributes);
	else if (name.compare("ejercitosParaOcupar") == 0)
		ejercitosParaOcupar(attributes);	
}

void DebugParser::ejercitosParaOcupar(const AttributeList& properties) {
	Jugador* jugador;
	for(xmlpp::SaxParser::AttributeList::const_iterator iter = properties.begin(); iter != properties.end(); ++iter)
		if (iter->name.compare("jugador") == 0)
			jugador = juego->getJugador(iter->value);
		else if (iter->name.compare("cantidad") == 0)
			jugador->setEjercitosParaOcupar(atoi(iter->value.data()));				
}

void DebugParser::dadosParaDefender(const AttributeList& properties) {
	Jugador* jugador;
	for(xmlpp::SaxParser::AttributeList::const_iterator iter = properties.begin(); iter != properties.end(); ++iter)
		if (iter->name.compare("jugador") == 0)
			jugador = juego->getJugador(iter->value);
		else if (iter->name.compare("cantidad") == 0)
			jugador->setDadosParaDefender(atoi(iter->value.data()));				
}

void DebugParser::pasar(const AttributeList& properties) {
	for(xmlpp::SaxParser::AttributeList::const_iterator iter = properties.begin(); iter != properties.end(); ++iter)
		if (iter->name.compare("jugador") == 0)
			juego->pasar(juego->getJugador(iter->value));
}

void DebugParser::atacar(const AttributeList& properties) {
	Glib::ustring colorJugador;
	Territorio* territorioJugador;
	Territorio* territorioEnemigo;
	int cantidadDeEjercitos;
	for(xmlpp::SaxParser::AttributeList::const_iterator iter = properties.begin(); iter != properties.end(); ++iter){
		if (iter->name.compare("jugador") == 0)
			colorJugador = iter->value;
		else if (iter->name.compare("territorioAtacante") == 0)
			territorioJugador = juego->getMapa()->obtenerTerritorio(iter->value);
		else if (iter->name.compare("territorioEnemigo") == 0)
				territorioEnemigo = juego->getMapa()->obtenerTerritorio(iter->value);
		else if (iter->name.compare("cantidadDeEjercitos") == 0)
				cantidadDeEjercitos = atoi(iter->value.data());
	}
	Ataque ataque(juego->getJugador(colorJugador),territorioJugador,territorioEnemigo,cantidadDeEjercitos);
	juego->realizarAtaque(&ataque);
}

void DebugParser::moverEjercitos(const AttributeList& properties) {
	Jugador* jugador;
	Territorio* origen;
	Territorio* destino;
	int cantidadDeEjercitos;
	for(xmlpp::SaxParser::AttributeList::const_iterator iter = properties.begin(); iter != properties.end(); ++iter){
		if (iter->name.compare("jugador") == 0)
			jugador = juego->getJugador(iter->value);
		else if (iter->name.compare("origen") == 0)
			origen = juego->getMapa()->obtenerTerritorio(iter->value);
		else if (iter->name.compare("destino") == 0)
				destino = juego->getMapa()->obtenerTerritorio(iter->value);
		else if (iter->name.compare("cantidadDeEjercitos") == 0)
				cantidadDeEjercitos = atoi(iter->value.data());
	}
	juego->moverEjercitos(jugador,origen,destino,cantidadDeEjercitos);
}

void DebugParser::colocarEjercitos(const AttributeList& properties) {
	Glib::ustring colorJugador;
	Territorio* territorioJugador;
	int cantidadDeEjercitos;
	for(xmlpp::SaxParser::AttributeList::const_iterator iter = properties.begin(); iter != properties.end(); ++iter){
		if (iter->name.compare("jugador") == 0)
			colorJugador = iter->value;
		else if (iter->name.compare("territorioJugador") == 0)
			territorioJugador = juego->getMapa()->obtenerTerritorio(iter->value);
		else if (iter->name.compare("cantidadDeEjercitos") == 0)
				cantidadDeEjercitos = atoi(iter->value.data());
	}
	juego->colocarEjercitos(juego->getJugador(colorJugador),territorioJugador,cantidadDeEjercitos);
}


void DebugParser::on_end_element(const Glib::ustring& name)
{
	if (name.compare("mostrarEstado") == 0)
			juego->imprimirEstado();
}


void DebugParser::on_characters(const Glib::ustring& text)
{
}

void DebugParser::on_comment(const Glib::ustring& text)
{
}

void DebugParser::on_warning(const Glib::ustring& text)
{
  std::cout << "on_warning(): " << text << std::endl;
}

void DebugParser::on_error(const Glib::ustring& text)
{
  std::cout << "on_error(): " << text << std::endl;
}

void DebugParser::on_fatal_error(const Glib::ustring& text)
{
  std::cout << "on_fatal_error(): " << text << std::endl;
}
	


